package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @Author: 张波
 * @Time: 2025/8/24 15:24
 */
@Controller
public class JumpController {
	/// SpringMVC数据响应页面跳转
	@RequestMapping("/data1.do")
	public String page1(HttpServletRequest request){
		request.setAttribute("msg","返回值为视图字符串跳转到data1.jsp页面");
		return "redirect:/views/data1.jsp";//进行视图拼接 返回给客户端
	}
	//另外一种跳转通过ModelAndView对象返回
	//2、返回modelAndView设置视图
	//借助Spring功能 将对象的创建设置为参数 自动创建指定对象（可以理解为该对象交由Spring管理 可以直接注入使用）
	@RequestMapping("/data2.do")
	public ModelAndView data2(ModelAndView mv){
		mv.setViewName("data2");
		mv.addObject("msg","返回ModelAndView设置视图");
		return mv;
	}
	/// 二、SpringMVC数据响应返回数据
	//直接返回数据
	//直接返回字符串数据
	//使用httpServletResponse对象方法回写数据
	@RequestMapping("/data3.do")
	public void page3(HttpServletResponse httpServletResponse) throws IOException {
		httpServletResponse.setContentType("text/html;charset=UTF-8");
		httpServletResponse.setCharacterEncoding("UTF-8");
		PrintWriter writer = httpServletResponse.getWriter();
		writer.println("通过response获取输出流在页面输出数据");
	}
	//将需要返回的数据直接通过返回值返回
	@RequestMapping("/data4.do")
	@ResponseBody//告诉spring不要使用视图解析器解析
	public String page4(){
		return "通过返回值设置String直接返回数据";
	}
	//json数据是前后台进行数据交互的格式
	//本质也是字符串 可以通过拼接的形式实现
	@RequestMapping(value = "/data5.do")
	@ResponseBody
	public String page5(){
		return "{\"username\":\"zhangsan\",\"age\":18}";
	}
	//返回自定义对象
	@RequestMapping(value = "/data6.do")
	@ResponseBody
	public User page6(){
		//如下对象返回
		User user = new User(1, "张三", 18);
		//原本我们需要手动拼接json字符串 或者调用json工具类转换后返回
		//return "{\"username\":\"zhangsan\",\"age\":18}";
		return  user;//会使用工具类转换并返回
	}
	//返回集合对象
	@RequestMapping(value = "/data7.do")
	@ResponseBody
	public List<User> page7(){
		ArrayList<User> users = new ArrayList<>();
		users.add(new User(1,"a1",1));
		users.add(new User(2,"a2",2));
		users.add(new User(3,"a3",3));
		users.add(new User(4,"a4",4));
		return users;
	}
	/// 类型获取
	/// 基本类型获取
	@RequestMapping(value = "/arg1")
	@ResponseBody   /// 数据需要回写回来打印 故需要@ResponseBody
	/// 什么时候 不 需要 @ResponseBody？
	/// 当你需要返回一个视图（如 JSP、HTML 页面）时，就不需要 @ResponseBody。
	///Spring 会通过视图解析器（如 Thymeleaf、JSP）根据返回值寻找相应的页面。
	/// 当返回的数据是 HTML 页面、JSP 页面 等视图时，Spring 会根据 ModelAndView 或返回字符串去寻找视图，而不需要 @ResponseBody。
	public void getArg1(String username,int age){
		System.out.println(username);
		System.out.println(age);
	}
	@RequestMapping(value = "/arg2")
	@ResponseBody
	/// 就是value的值要和URL对的上

	public void getArg2(
			@RequestParam(value = "username2",required = true,defaultValue = "小黑")String a,
			@RequestParam(value = "age2",required = false) int b
	){
		System.out.println(a+"|"+b);
	}
	/// 类型参数获取
	@RequestMapping(value = "/arg3")
	@ResponseBody
	///
	public void getArg3( User user){
		System.out.println(user);
	}
	/// 数组类型传递
	@RequestMapping(value="/arg4")
	@ResponseBody
	public void save13(@RequestParam(value = "stars") String[] strs) throws IOException {
		System.out.println(Arrays.asList(strs));
	}
	/// json数据获取
	@RequestMapping("/arg5")
	@ResponseBody
	public void arg5(@RequestBody User user) throws IOException {
		System.out.println(user);
	}
	/// 存储自定义集合
	@RequestMapping("/arg6")
	@ResponseBody
	public void arg6( @RequestBody List<User> userList){
		System.out.println(userList);
	}
	/// 类型转换器
	@RequestMapping("/arg7")
	@ResponseBody
	public void arg7(Date date){
		System.out.println(date);
	}
	/// 请求头参数获取
	@RequestMapping(value="/arg8")
	@ResponseBody
	public void save20(@RequestHeader(value = "User-Agent",required = false) String user_agent) throws IOException {
		System.out.println(user_agent);
	}
	/// 请求cookie获取
	@RequestMapping(value="arg9")
	@ResponseBody
	public void save21(@CookieValue(value = "JSESSIONID") String jsessionId) throws IOException {
		System.out.println(jsessionId);
	}

}
